/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.entidades;

import com.sun.org.apache.bcel.internal.generic.INSTANCEOF;
import java.awt.Rectangle;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import persistencia.FachadaPersistencia;

/**
 *
 * @author Matias, Christian
 */
public class Partida {
    
    private int idPartida;
    private Turnos turnos;
    private Jugadores jugadores;
    private Mapa mapa;
    private Nivel nivel;
    private EstadoPartida estadoPartida;
    private int contadorTimer;
    private Timer timer;
    private String textoGanar;
    
    
    public Partida()
    {
        mapa = new Mapa();
        nivel = new Nivel();
        turnos = new Turnos();
        jugadores = new Jugadores();
        timer = new Timer();
        textoGanar = "0";
    }
    
    public void Timer(Timer timer)
    {
        this.timer = timer;
    }
    public Timer GetTimer()
    {
        return this.timer;
    }
    public void SetEstado(EstadoPartida result)
    {
        this.estadoPartida = result;
    }
    public EstadoPartida EstadoPartida()
    {
        return this.estadoPartida;
    }
    public Nivel GetNivel()
    {
        return this.nivel;
    }
    public void SetNivel(Nivel nivel)
    {
        this.nivel = nivel;
    }
    public Jugadores getJugadores()
    {
        return jugadores;
    }
    public Turnos GetTurnos()
    {
        return turnos;
    }
    public void SetMapa(Mapa mapa){
        this.mapa = mapa;
    }
    public Mapa GetMapa(){
        return mapa;
    }
    public boolean SeMovieronBarcos()
    {
        return jugadores.SeMovieronBarcos();
    }
    
    public int IniciarPartida(String nombre,String rol,Nivel nivel,int idJugador,int idBarco)
    {   textoGanar = "0";
        Rectangle rectangle = new Rectangle(5, 3, 50, 50);
        //Info de la BD
        try {
             
                this.SetNivel(nivel);
                System.out.println("Cant minas prof Barreminas: " + nivel.getMinasProdundida() + " Cant sup: " + nivel.GetMinasSuperficie());
                //Creo Barco Minador
                int visionX = (int)(rectangle.getX() - (5 * rectangle.getWidth()) /2) + 20;
                int visionY = (int)(rectangle.getY() - (5 * rectangle.getHeight()) /2) + 20;
                int visionWidth = (int)rectangle.getWidth() * 4;
                int visionHeight = (int)rectangle.getHeight() * 4;
                Rectangle vision = new Rectangle(visionX,visionY,visionWidth,visionHeight);
                Barco barcoMinador = new Minador(nivel.GetProyectiles(),rectangle, idBarco,nivel.GetVelocidad(), nivel.GetBlindaje(), Orientacion.NORTE,nivel.GetMinasProfundidad(),nivel.GetMinasSuperficie(),vision);  
                //Creo Jugador
                //El que inicia la partida tendra el turno
                Jugador jugador = new Jugador(idJugador,nombre, rol, barcoMinador);
                this.getJugadores().agregarJugador(jugador);
                System.out.println("Se crea jugador " + idJugador);

                //Turnos
                int accionesDelTurno = 0;
                //El idJugador se va mapear con el idTurno 
                Turno t1 = new Turno(idJugador, accionesDelTurno);
                this.GetTurnos().AsignarTurno(t1);
                System.out.println("Se asigna turno jugador " + idJugador);
                System.out.println("Barco numero " + idBarco + " Proyectiles: " + barcoMinador.getProyectiles());
                System.out.println("Velocidad " + barcoMinador.getVelocidad() + " Minas profundidad: " + ((Minador)barcoMinador).getMinasProfundidad());
                System.out.println("Minas de superficie " + ((Minador)barcoMinador).getMinasSuperficie());
                System.out.println("Turno " + t1.GetIdTurno());        
                this.SetEstado(EstadoPartida.ABIERTA);
        
        } catch (Exception ex) {
            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
        }
       
        return idJugador;
    }
    
    public int UnircePartida(String nombre,String rol)
    {
        //Creo Barco Barreminas
        Rectangle rectangle = new Rectangle(725, 412, 100, 100);
        int radarX = (int)(rectangle.getX() - (rectangle.getWidth()/2));
        int radarY = (int)(rectangle.getY() - (rectangle.getHeight()/2));
        int radarWidth = (int)rectangle.getWidth()*2;
        int radarHeight = (int)rectangle.getHeight()*2;
        Rectangle radar = new Rectangle(radarX, radarY, radarWidth, radarHeight);
        
        int idJugador  = this.getJugadores().GetJugador(0).getId() + 1;
        int idBarco = this.getJugadores().GetJugador(0).GetBarco().getId() + 1;
        Nivel nivel = this.GetNivel();
        System.out.println("Cant minas prof Barreminas: " + nivel.getMinasProdundida() + " Cant sup: " + nivel.GetMinasSuperficie());
        
        int visionX = (int)(rectangle.getX() - (5 * rectangle.getWidth()) /2) + 20;
        int visionY = (int)(rectangle.getY() - (5 * rectangle.getHeight()) /2) + 20;
        int visionWidth = (int)rectangle.getWidth() * 4;
        int visionHeight = (int)rectangle.getHeight() * 4;
        Rectangle vision = new Rectangle(visionX,visionY,visionWidth,visionHeight);
        Barco barcoBarreminas = new Barremina(rectangle,idBarco,nivel.GetVelocidad() /2,nivel.GetBlindaje()*2, Orientacion.SUR, nivel.GetProyectiles() * 2,nivel.GetMinasProfundidad() * 2, radar,vision);
        //Creo Jugador
        //El que inicia la partida tendra el turno
        Jugador jugador = new Jugador(idJugador,nombre, rol, barcoBarreminas);
        //jugadores.agregarJugador(jugador);
        this.getJugadores().agregarJugador(jugador);
        System.out.println("Se crea jugador " + idJugador);
        
        //Turnos
        int accionesDelTurno = 0;
        //El idPartida se va mapear con el idTurno 
        Turno t2 = new Turno(idJugador, accionesDelTurno);
        this.GetTurnos().AsignarTurno(t2);
        System.out.println("Se asigna turno jugador " + idJugador);
        System.out.println("Barco numero " + idBarco + " Proyectiles: " + barcoBarreminas.getProyectiles());
        System.out.println("Velocidad " + barcoBarreminas.getVelocidad());
        System.out.println("Cargas profundidad de superficie " + ((Barremina)barcoBarreminas).getCargasProfundidad());
        System.out.println("Turno " + t2.GetIdTurno());
        this.SetEstado(EstadoPartida.JUEGO);
        return idJugador;
    }
    
    public void UnirJugadorSistema(String nombre,int pSeg,ArrayList<Coordenada> coordenadasTray)
    {
        //Creo Barco Crucero
        Rectangle rectangle = new Rectangle(855, 46, 100, 100);
        
        int idJugador  = this.getJugadores().GetJugador(1).getId() + 1;
        int idBarco = this.getJugadores().GetJugador(1).GetBarco().getId() + 1;
        
        Nivel nivel = this.GetNivel();
        System.out.println("Cant minas prof Barreminas: " + nivel.getMinasProdundida() + " Cant sup: " + nivel.GetMinasSuperficie());
        Rectangle vision = new Rectangle();
        Barco crucero = new Crucero(0, rectangle, idBarco,1, 1, Orientacion.ESTE, coordenadasTray,vision);
        //Creo Jugador
        //El que inicia la partida tendra el turno
        Jugador jugador = new Jugador(idJugador,nombre, "Sistema ", crucero);
        //jugadores.agregarJugador(jugador);
        this.getJugadores().agregarJugador(jugador);
        System.out.println("Se crea jugador " + idJugador);
        
        try {
            this.Start(pSeg, coordenadasTray);
        } catch (Exception ex) {
            Logger.getLogger(Partida.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public boolean IncrementarAccionesTurno()
    {
        boolean result = false;
        try
        {
            //Incremento las acciones dentro del turno
            Turno turno = this.GetTurnos().GetTurnoActual();
            turno.SetAccionesDelTurno(turno.GetAccionesDelTurno() + 1);
            int cantidadAcciones = turno.GetAccionesDelTurno();
            if(cantidadAcciones == 5)
            {
                turno.SetAccionesDelTurno(0);
                this.GetTurnos().PasarTurno();
            }
            result = true;
        }
        catch(Exception ex)
        {
            result = false;
        }
        return result;
    }
    public ArrayList<String> ActualizacionDePartida(int idJugador)
    {
        ArrayList<String> result = new ArrayList<String>();
        Jugadores jugadores = this.getJugadores();
        if(jugadores.CantidadJugadores() >= 2)
        {
            Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
            Barremina barremina = (Barremina) jugadores.GetJugador(1).GetBarco();
            Crucero crucero = null;
            if(jugadores.CantidadJugadores() == 3)
            {
                crucero = (Crucero)jugadores.GetJugador(2).GetBarco();
            }
            Turno turno = this.GetTurnos().GetTurnoActual();
            if(this.getJugadores().GetJugador(0).getId() == turno.GetIdTurno())
            {
                result.add("T,"+ this.getJugadores().GetJugador(0).getId() + ",1");
                result.add("T,"+ this.getJugadores().GetJugador(1).getId() + ",0");
            }
            else
            {
                result.add("T,"+ this.getJugadores().GetJugador(0).getId() + ",0");
                result.add("T,"+ this.getJugadores().GetJugador(1).getId() + ",1");
            }
            Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
            if(barremina.seMovioElBarco() || minador.seMovioElBarco())
            {
                if(barco instanceof Barremina)
                {
                    String ori = this.GetOrientacion(barremina.getOrientacion());
                    result.add("B,2," + (int)barremina.getX() + "," + (int)barremina.getY() + "," + ori + "," + "F" + "," + (int)barremina.GetRangoVision().getX()  + "," + (int)barremina.GetRangoVision().getY()); 
                    barremina.moviElBarco(); 

                    //Si muestro minador
                    if(barco.GetRangoVision().intersects(minador))
                    {
                        String ori2 = this.GetOrientacion(minador.getOrientacion());
                        result.add("B,1," + (int)minador.getX() + "," + (int)minador.getY() + "," + ori2 + "," + "F" + "," + (int)minador.GetRangoVision().getX()  + "," + (int)minador.GetRangoVision().getY());  
                        minador.moviElBarco();
                    } 
                }
                else
                {
                    String ori2 = this.GetOrientacion(minador.getOrientacion());
                    result.add("B,1," + (int)minador.getX() + "," + (int)minador.getY() + "," + ori2 + "," + "F" + "," + (int)minador.GetRangoVision().getX()  + "," + (int)minador.GetRangoVision().getY());  
                    minador.moviElBarco();

                    if(barco.GetRangoVision().intersects(barremina))
                    {
                        String ori = this.GetOrientacion(barremina.getOrientacion());
                        result.add("B,2," + (int)barremina.getX() + "," + (int)barremina.getY() + "," + ori + "," + "F" + "," + (int)barremina.GetRangoVision().getX()  + "," + (int)barremina.GetRangoVision().getY()); 
                        barremina.moviElBarco(); 
                    }
                }
            }
            /*
            if(minador.seMovioElBarco() && !minador.seHundioBarco())
            {
                if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().getBounds().intersects(minador))
                {
                    String ori = this.GetOrientacion(minador.getOrientacion());
                    result.add("B,1," + (int)minador.getX() + "," + (int)minador.getY() + "," + ori + "," + "F" + "," + (int)minador.GetRangoVision().getX()  + "," + (int)minador.GetRangoVision().getY());  
                    minador.moviElBarco();
                }
            }
            if(barremina.seMovioElBarco() && !barremina.seHundioBarco())
            {
                if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().getBounds().intersects(barremina))
                {
                    String ori = this.GetOrientacion(barremina.getOrientacion());
                    result.add("B,2," + (int)barremina.getX() + "," + (int)barremina.getY() + "," + ori + "," + "F" + "," + (int)barremina.GetRangoVision().getX()  + "," + (int)barremina.GetRangoVision().getY()); 
                    barremina.moviElBarco();
                }
            }
            */
            if(crucero != null)
            {
                if(crucero.seMovioElBarco() && !crucero.seHundioBarco())
                {
                    if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(crucero))
                    {
                        String ori = this.GetOrientacion(crucero.getOrientacion());
                        result.add("B,3," + (int)crucero.getX() + "," + (int)crucero.getY() + "," + ori + "," + "F");   
                        crucero.moviElBarco();
                    }
                }
            }
            if(minador.seLanzoProyectil())
            {           
                if(barremina.seHundioBarco()) 
                {
                    if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(barremina))
                    {
                        System.out.println("SE HUNDIO BARREMINA");
                        String ori = this.GetOrientacion(barremina.getOrientacion());
                        result.add("B,2," + (int)barremina.getX() + "," + (int)barremina.getY() + "," + ori + "," + "H" +"," + (int)barremina.GetRangoVision().getX()  + "," + (int)barremina.GetRangoVision().getY());
                    }
                }
                if(crucero != null)
                {
                    if(crucero.seHundioBarco())
                    {
                        if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(crucero))
                        {
                            String ori = this.GetOrientacion(crucero.getOrientacion());
                            result.add("B,3," + (int)crucero.getX() + "," + (int)crucero.getY() + "," + ori + "," + "H");
                        }
                    }
                }
                
                minador.setSeLanzoProyectil(false);
                
            }
            
            if(barremina.seHundioBarco()) 
            {
                if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(barremina))
                {
                    System.out.println("SE HUNDIO BARREMINA");
                    String ori = this.GetOrientacion(barremina.getOrientacion());
                    result.add("B,2," + (int)barremina.getX() + "," + (int)barremina.getY() + "," + ori + "," + "H" + ","+(int)barremina.GetRangoVision().getX()  + "," + (int)barremina.GetRangoVision().getY());
                }
            }
            if(crucero != null)
            {
                if(crucero.seHundioBarco())
                {
                    if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(crucero))
                    {
                        String ori = this.GetOrientacion(crucero.getOrientacion());
                        result.add("B,3," + (int)crucero.getX() + "," + (int)crucero.getY() + "," + ori + "," + "H");
                    }
                }
            }
            if(minador.seHundioBarco()) 
            {
                    if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(minador))
                    {
                        String ori = this.GetOrientacion(minador.getOrientacion());
                        System.out.println("SE HUNDIO MINADOR");
                        result.add("B,1," + (int)minador.getX() + "," + (int)minador.getY() + "," + ori + "," + "H" + "," +(int)minador.GetRangoVision().getX()  + "," + (int)minador.GetRangoVision().getY());
                    }
            }
            if(barremina.seLanzoProyectil() )
            {
                if(minador.seHundioBarco()) 
                {
                    if(this.getJugadores().ObtenerJugador(idJugador).GetBarco().GetRangoVision().intersects(minador))
                    {
                        String ori = this.GetOrientacion(minador.getOrientacion());
                        System.out.println("SE HUNDIO MINADOR");
                        result.add("B,1," + (int)minador.getX() + "," + (int)minador.getY() + "," + ori + "," + "H" + "," +(int)minador.GetRangoVision().getX()  + "," + (int)minador.GetRangoVision().getY());
                    }
                }
                barremina.setSeLanzoProyectil(false);
            }            
            ArrayList<Mina> minasProf = minador.GetMinasProfundidad(); 

            for(Mina m : minasProf)
            {
                if(m.getFueLanzada())
                {
                    System.out.println("Lanzo mina profundidad");
                    if(barco.GetRangoVision().contains(m.getX(),m.getY()))
                    {
                        System.out.println("Mina profundidad dentro del rango");
                        result.add("MP,"+ m.GetIdMina()+"," + (int)m.getX() + "," + (int)m.getY() + "," + m.getFueEliminada());
                    }
                }
            }
            ArrayList<Mina> minasSuper = minador.GetMinasSuperficie(); 

            for(Mina m : minasSuper)
            {
                if(m.getFueLanzada())
                {
                    System.out.println("Lanzo mina superficie");
                    if(barco.GetRangoVision().contains(m.getX(),m.getY()))
                    {
                        System.out.println("Mina superficie dentro del rango");
                        result.add("MS,"+ m.GetIdMina()+"," + (int)m.getX() + "," + (int)m.getY()+ "," + m.getFueEliminada());
                    }
                }
            }
            
            //Ganar Juego
            result.add("G" + "," + textoGanar);
        }
        return result;
    }
    
    public boolean RectangleColicciona(Rectangle r1,Rectangle r2)
    {
        boolean result = false;
        if(r1.contains(r2.getX(), r2.getY(), r2.getWidth(), r2.getHeight()))
        {
            result = true;
        }
        return result;
    }
    public String GetOrientacion(Orientacion orientacion)
    {
        String result = "";
        switch(orientacion)
        {
            case SUR: result = "S";
                     break;
            case NORTE: result = "N";
                    break;
            case ESTE: result = "E";
                    break;
            case OESTE: result = "O";
                   break;
            case NORESTE: result = "NE";
                  break;
            case NOROESTE: result = "NO";
                  break;
            case SURESTE: result = "SE";
                break;
            case SUROESTE: result = "SO";
                break;
        }
        return result;
    }
    
    public void Start(int pSeg,ArrayList<Coordenada> trayectoria) throws Exception {
		// le asignamos una tarea al timer
		timer.schedule(new TareaBarcoCrucero(trayectoria), pSeg, 10000);
    }// end Start
 
    public ArrayList<String> GetEstaticos(Islas islas,Puertos puertos)
    {
        
        ArrayList<String> result = new ArrayList<String>();
        for (Iterator iterador = islas.ObtenerIslas().listIterator(); iterador.hasNext(); ) 
        {
            Isla isla = (Isla) iterador.next();
            result.add("I,"+isla.getId()+","+isla.getX() +","+isla.getY());
            this.mapa.agregarIsla(isla);
        }
        for (Iterator iterador = puertos.ObtenerPuertos().listIterator(); iterador.hasNext(); ) 
        {
            Puerto puerto = (Puerto) iterador.next();
            result.add("P,"+puerto.getId()+","+puerto.getX() +","+puerto.getY());
            this.mapa.agregarPuerto(puerto);
        }
        
        return result;
    }
            
    public void PasarTurno()
    {
        this.GetTurnos().PasarTurno();
    }
    public boolean MoverBarcoPartida(int idJugador,Coordenada coord)
    {
        boolean seMovioBarco = false;
        Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
        
        if((barco instanceof Minador) || (barco instanceof Barremina)) 
        {
            if(!BarcoColisionaIsla(idJugador, coord) && 
               !BarcoColisionaBarco(idJugador, coord) && 
               !BarcoColisionaPuerto(idJugador, coord)) 
            {
                barco.actualizarOrientacion(coord);
                barco.MoverBarco(coord);
                if(barco instanceof Barremina) 
                {
                    Barremina barremina = (Barremina)barco;
                    barremina.moverRadar(coord);
                }
                this.IncrementarAccionesTurno();
                seMovioBarco = true;
            }
        }else 
        { //Crucero
            barco.actualizarOrientacion(coord);
            barco.MoverBarco(coord);
            seMovioBarco = true;
        }
        
        return seMovioBarco;
    }
    class TareaBarcoCrucero extends TimerTask
    {
            private int contadorTimer;
            private ArrayList<Coordenada> trayectoria;
            public TareaBarcoCrucero(ArrayList<Coordenada> trayectoria)
            {
                this.trayectoria = trayectoria;
                this.contadorTimer = 0;
            }
            @Override
            public void run() 
            {
                if( contadorTimer <=  trayectoria.size() - 1)
                {
                    Coordenada cord = trayectoria.get(contadorTimer);
                    Barco barco = getJugadores().GetJugador(2).GetBarco();
                    Crucero crucero = (Crucero) getJugadores().GetJugador(2).GetBarco();
                    //System.out.println("CRUCERO: " + crucero);
                    if(!crucero.seHundioBarco()) 
                    {
                        //System.out.println("SE MUEVE CRUCERO");
                        MoverBarcoPartida(getJugadores().GetJugador(2).getId(),cord);
                        System.out.println("Cord x: " + cord.getCordX() + " Coord y: " + cord.getCordY());
                        boolean colision = ExisteColisionMinaSuperficie(getJugadores().GetJugador(2).getId());
                        boolean colisionMinaProf = ExisteColisionMinaProfundidad(crucero);
                        
                        if(colision || colisionMinaProf)
                        {
                            textoGanar = "Gano el Minador";
                        }
                        
                    } 
                    contadorTimer += 1;
                }
                
                if(contadorTimer == trayectoria.size() -1)
                {
                    timer.cancel();
                    //Crucero llego al destino
                    textoGanar = "Gano el Barremina";
                }
            }
    }
    
    //Determina se el proyectil colisiono con algun barco
    public boolean ExisteColisionProyectil(int idJugador,Coordenada coordPtoImpacto)
    {
        boolean seHundioBarco = false;
        
        Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
        
        //Solo el minador y barremina pueden lanzar proyectiles
        if(barco instanceof Minador)
        {
            //Si el minador lanza el proyectil, este puede ser intersectado por el barremina o el crucero
            Barremina barremina = (Barremina) jugadores.GetJugador(1).GetBarco();
            if(barremina.contains(coordPtoImpacto.getCordX(), coordPtoImpacto.getCordY()))
            {
                barremina.recibirImpacto();
                seHundioBarco = barremina.seHundioBarco();
                System.out.println("BARREMINA RECIBE IMPACTO");
                if(seHundioBarco)
                {
                    textoGanar = "Gano el Minador";
                }
            }
            
            Crucero crucero = (Crucero) jugadores.GetJugador(2).GetBarco();
            if(crucero.contains(coordPtoImpacto.getCordX(), coordPtoImpacto.getCordY()))
            {
                crucero.recibirImpacto();
                seHundioBarco = crucero.seHundioBarco();
                System.out.println("CRUCERO RECIBE IMPACTO");
                if(seHundioBarco)
                {
                    textoGanar = "Gano el Minador";
                }
            }
            
        } else if(barco instanceof Barremina)
        {
            //Si el barremina lanza proyectil, solo el minador puede intersectarlo.
            Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
            if(minador.contains(coordPtoImpacto.getCordX(), coordPtoImpacto.getCordY()))
            {
                minador.recibirImpacto();
                seHundioBarco = minador.seHundioBarco();
                System.out.println("MINADOR RECIBE IMPACTO");
                if(seHundioBarco)
                {
                    textoGanar = "Gano el Barremina";
                }
            } 
            
            Crucero crucero = (Crucero) jugadores.GetJugador(2).GetBarco();
            if(crucero.contains(coordPtoImpacto.getCordX(), coordPtoImpacto.getCordY()))
            {
                crucero.recibirImpacto();
                seHundioBarco = crucero.seHundioBarco();
                System.out.println("CRUCERO RECIBE IMPACTO");
                if(seHundioBarco)
                {
                    textoGanar = "Gano el Minador";
                }
            }
        }
        
        return seHundioBarco;
    }
    
    //Determina si algun barco colisiono con una mina de superficie
    public boolean ExisteColisionMinaSuperficie(int idJugador)
    {
        boolean seHundioBarco = false;
        
        Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
        
        Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
        ArrayList<Mina> listaDeMinasSuperficie = minador.GetMinasSuperficie(); 
        
        for (Mina mina : listaDeMinasSuperficie) {
            System.out.println("MINA SUP: " + mina);
            System.out.println("BARCO: " + barco);
            if(barco.contains(mina.getX(), mina.getY()))
            {
                seHundioBarco = true;
                barco.setBlindaje(0);
                System.out.println("SE HUNDE BARCO MINA SUPERFICIE");
                
                if(seHundioBarco)
                {
                    if(barco instanceof Barremina)
                    {
                        textoGanar = "Gano el Minador";
                    } else if(barco instanceof Minador)
                    {
                        textoGanar = "Gano el Barremina";
                    } else if(barco instanceof Crucero)
                    {
                        textoGanar = "Gano el Minador";
                    }
                }
            }
        }
        
        return seHundioBarco;
    }    
    
    //Colisionar crusero con mina de profundidad
    public boolean ExisteColisionMinaProfundidad(Crucero crucero)
    {
        boolean seHundioBarco = false;
        
        Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
        ArrayList<Mina> listaDeMinasProfundidad = minador.GetMinasProfundidad(); 
        
        for (Mina mina : listaDeMinasProfundidad) {
            if(crucero.contains(mina.getX(), mina.getY()))
            {
                seHundioBarco = true;
                crucero.setBlindaje(0);
                
                if(seHundioBarco)
                {
                    textoGanar = "Gano el Minador";
                }
            }
        }
        
        return seHundioBarco;
    } 
    
    //Determinar si existe colision del barco con la isla.
    public boolean BarcoColisionaIsla(int idJugador, Coordenada coord)
    {
        Islas islas = this.mapa.GetIstlas();
        ArrayList<Isla> listaIslas = islas.ObtenerIslas();
        
        Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
        if((barco instanceof Barremina) || (barco instanceof Minador))
        {
            for (Isla isla : listaIslas) {
                if(isla.contains(coord.getCordX(), coord.getCordY())) {
                    return true;
                }
            }
        }
        
        return false;
    }
    
    //Determinar si existe colision del barco con el puerto.
    public boolean BarcoColisionaPuerto(int idJugador, Coordenada coord)
    {
        Puertos puertos = this.mapa.GetPuertos();
        ArrayList<Puerto> listaPuertos = puertos.ObtenerPuertos();
        
        Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
        if((barco instanceof Barremina) || (barco instanceof Minador))
        {
            for (Puerto puerto : listaPuertos) {
                if(puerto.contains(coord.getCordX(), coord.getCordY())) {
                    return true;
                }
            }
        }
        
        return false;
    }    
    
    //Determinar si existe colision entre barcos
    public boolean BarcoColisionaBarco(int idJugador, Coordenada coord)
    {
        boolean colisiona = false;
        Barco barco = this.getJugadores().ObtenerJugador(idJugador).GetBarco();
        
        //Ver si colisiona con Minador o Crucero
        if(barco instanceof Barremina)
        {
            Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
            Crucero crucero = (Crucero) jugadores.GetJugador(2).GetBarco();
            
            if(minador.contains(coord.getCordX(), coord.getCordY()) || 
              (crucero.contains(coord.getCordX(), coord.getCordY())))
            {
                colisiona = true;
            }
        } 
        else if(barco instanceof Minador)
        {
            Barremina barremina = (Barremina) jugadores.GetJugador(1).GetBarco();
            Crucero crucero = (Crucero) jugadores.GetJugador(2).GetBarco();
            
            if(barremina.contains(coord.getCordX(), coord.getCordY()) || 
              (crucero.contains(coord.getCordX(), coord.getCordY())))
            {
                colisiona = true;
            }        
        }
        
        return colisiona;
    }
    
    //Eliminar mina profundidad
    public boolean EliminarMinaProfundidad()
    {
        boolean seEliminoMIna = false;
        
        Barremina barremina = (Barremina) jugadores.GetJugador(1).GetBarco();
        
        Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
        ArrayList<Mina> listaDeMinasProfundidad = minador.GetMinasProfundidad(); 
        
        for (Mina mina : listaDeMinasProfundidad) {
            Rectangle areaImpactoMina = new Rectangle((int)mina.getX(), (int)mina.getY(), 30, 30);
            if(barremina.getRadar().intersects(areaImpactoMina))
            {
                seEliminoMIna = true;
                barremina.lanzarCargaDeProfundidad();
                minador.eliminarMinaProfundidad(mina);
                 System.out.println("SE ELIMINO MINA PROFUNDIDAD");
                 return true;
            }else {
                System.out.println("NO SE ELIMINO MINA PROFUNDIDAD");
            }
        }
        
        return seEliminoMIna;
    }
    
    //Eliminar mina superficie
    public boolean EliminarMinaSuperficie(Coordenada coordImpactoProy)
    {
        boolean seEliminoMIna = false;
        
        Barremina barremina = (Barremina) jugadores.GetJugador(1).GetBarco();
        
        Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
        ArrayList<Mina> listaDeMinasSuperficie = minador.GetMinasSuperficie(); 

        for (Mina mina : listaDeMinasSuperficie) {
            Rectangle areaImpactoMina = new Rectangle((int)mina.getX(), (int)mina.getY(), 30, 30);
            if(areaImpactoMina.contains(coordImpactoProy.getCordX(), coordImpactoProy.getCordY()))
            {
                System.out.println("SE ELIMINO MINA SUPERFICE");
                seEliminoMIna = true;
                minador.eliminarMinaSuperficie(mina);
                return true;
            } else {
                System.out.println("NO SE ELIMINO MINA SUPERFICE");
            }
        }
        
        return seEliminoMIna;
    }
    
    public String GanaJuego()
    {
        String resultado = "";
        Minador minador = (Minador) jugadores.GetJugador(0).GetBarco();
        Barremina barremina = (Barremina) jugadores.GetJugador(1).GetBarco();
        
        Crucero crucero = null;
        if(this.jugadores.CantidadJugadores() == 3)
        {
            crucero = (Crucero) jugadores.GetJugador(2).GetBarco();
        }
        if(minador.seHundioBarco())
        {
            resultado = "Gano el Barremina";
        } else if(barremina.seHundioBarco())
        {
            resultado = "Gano el Minador";
        }else {  
            if(crucero != null)
            {
                if(crucero.seHundioBarco())
                {
                    resultado = "Gano el Minador";
                }
                /*
                else
                {
                    resultado = "Gano el Barremina";
                }
                * */
            }
        }         
        return resultado;
    }
    public boolean RectangleColission( Rectangle a, Rectangle b)
    {
        if ( (a.getX() < b.getX() + b.getWidth()) && (b.getX() < a.getX() + a.getWidth()) && (a.getY() < b.getY() + b.getHeight()))
        {
            return b.getY() < a.getY() + a.getHeight();
        }

        return false;
    }
    
    public void FinalizarPartida()
    {
        timer.cancel();
       textoGanar = "Partida Finalizada";
    }
}


